package com.jim.healio.graphrag.service;

import com.jim.healio.graphrag.model.MedicalEntity;
import com.jim.healio.graphrag.model.MedicalDocument;
import com.jim.healio.graphrag.model.MedicalRelationship;
import com.jim.healio.graphrag.service.impl.RealGraphRAGServiceImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.Arrays;

/**
 * 医学知识数据导入器
 * 在应用启动时初始化基础医学知识数据
 */
@Service
@ConditionalOnProperty(prefix = "healio.graphrag", name = "enabled", havingValue = "true")
public class MedicalKnowledgeImporter implements CommandLineRunner {
    
    private static final Logger logger = LoggerFactory.getLogger(MedicalKnowledgeImporter.class);
    
    @Autowired
    private GraphRAGService graphRAGService;
    
    @Autowired
    private RealGraphRAGServiceImpl realGraphRAGService;
    
    @Override
    public void run(String... args) throws Exception {
        logger.info("开始初始化医学知识数据...");
        
        try {
            // 初始化GraphRAG系统
            realGraphRAGService.initializeGraphRAG();
            
            // 导入基础医学实体
            importBasicMedicalEntities();
            
            // 导入医学文档
            importMedicalDocuments();
            
            logger.info("医学知识数据初始化完成");
            logger.info(realGraphRAGService.getSystemStatus());
            
        } catch (Exception e) {
            logger.error("医学知识数据初始化失败", e);
        }
    }
    
    /**
     * 导入基础医学实体
     */
    private void importBasicMedicalEntities() {
        logger.info("导入基础医学实体...");
        
        // 疾病实体
        MedicalEntity diabetes = new MedicalEntity(
            "diabetes_type2", 
            "2型糖尿病", 
            MedicalEntity.EntityType.DISEASE,
            "最常见的糖尿病类型，占糖尿病患者的90%以上，主要由胰岛素抵抗和胰岛β细胞功能缺陷引起"
        );
        diabetes.getAliases().addAll(Arrays.asList("T2DM", "非胰岛素依赖性糖尿病", "成人型糖尿病"));
        diabetes.getProperties().put("icd10", "E11");
        diabetes.getProperties().put("prevalence", "全球约4.63亿人");
        
        MedicalEntity hypertension = new MedicalEntity(
            "hypertension_primary", 
            "原发性高血压", 
            MedicalEntity.EntityType.DISEASE,
            "成人收缩压≥140mmHg和/或舒张压≥90mmHg，病因不明的高血压"
        );
        hypertension.getAliases().addAll(Arrays.asList("高血压病", "essential hypertension"));
        hypertension.getProperties().put("icd10", "I10");
        hypertension.getProperties().put("diagnostic_criteria", "SBP≥140mmHg或DBP≥90mmHg");
        
        // 药物实体
        MedicalEntity metformin = new MedicalEntity(
            "metformin", 
            "二甲双胍", 
            MedicalEntity.EntityType.DRUG,
            "双胍类口服降糖药，2型糖尿病一线治疗药物，主要通过抑制肝糖输出降低血糖"
        );
        metformin.getAliases().addAll(Arrays.asList("格华止", "Glucophage", "盐酸二甲双胍"));
        metformin.getProperties().put("drug_class", "双胍类");
        metformin.getProperties().put("mechanism", "抑制肝糖输出，增加胰岛素敏感性");
        
        MedicalEntity acei = new MedicalEntity(
            "acei_drugs", 
            "ACEI类药物", 
            MedicalEntity.EntityType.DRUG,
            "血管紧张素转换酶抑制剂，用于治疗高血压和心力衰竭，具有心肾保护作用"
        );
        acei.getAliases().addAll(Arrays.asList("ACE抑制剂", "血管紧张素转换酶抑制剂"));
        acei.getProperties().put("drug_class", "ACEI");
        acei.getProperties().put("mechanism", "抑制ACE，减少血管紧张素II生成");
        
        // 症状实体
        MedicalEntity polyuria = new MedicalEntity(
            "polyuria", 
            "多尿", 
            MedicalEntity.EntityType.SYMPTOM,
            "24小时尿量超过2500ml，常见于糖尿病、尿崩症等疾病"
        );
        polyuria.getProperties().put("definition", "24小时尿量>2500ml");
        
        MedicalEntity polydipsia = new MedicalEntity(
            "polydipsia", 
            "多饮", 
            MedicalEntity.EntityType.SYMPTOM,
            "饮水量明显增加，常伴随多尿出现，是糖尿病的典型症状之一"
        );
        
        // 存储实体
        graphRAGService.storeEntity(diabetes);
        graphRAGService.storeEntity(hypertension);
        graphRAGService.storeEntity(metformin);
        graphRAGService.storeEntity(acei);
        graphRAGService.storeEntity(polyuria);
        graphRAGService.storeEntity(polydipsia);
        
        logger.info("基础医学实体导入完成");
    }
    
    /**
     * 导入医学文档
     */
    private void importMedicalDocuments() {
        logger.info("导入医学文档...");
        
        // ADA糖尿病指南
        MedicalDocument adaGuideline = new MedicalDocument(
            "ada_diabetes_2024",
            "美国糖尿病学会(ADA)糖尿病诊疗指南2024",
            "对于2型糖尿病患者，推荐首选二甲双胍作为一线治疗药物。如果患者有心血管疾病风险，可考虑联用SGLT-2抑制剂或GLP-1受体激动剂。血糖控制目标：大多数成年患者HbA1c<7%，但需要个体化制定。血压控制目标：<130/80mmHg。LDL胆固醇目标：有心血管疾病的患者<1.8mmol/L。",
            MedicalDocument.DocumentType.GUIDELINE
        );
        adaGuideline.setSource("American Diabetes Association");
        adaGuideline.setAuthor("ADA Professional Practice Committee");
        adaGuideline.addTag("糖尿病");
        adaGuideline.addTag("治疗指南");
        adaGuideline.addTag("二甲双胍");
        adaGuideline.addExtractedEntity("diabetes_type2");
        adaGuideline.addExtractedEntity("metformin");
        
        // 高血压防治指南
        MedicalDocument hypertensionGuideline = new MedicalDocument(
            "chinese_hypertension_2018",
            "中国高血压防治指南2018修订版",
            "高血压的非药物治疗包括减少钠盐摄入（<6g/天）、控制体重（BMI<24kg/m²）、规律运动、戒烟限酒。药物治疗首选ACEI、ARB、利尿剂、钙通道阻滞剂中的任意一种。血压控制目标：一般患者<140/90mmHg，糖尿病或慢性肾病患者<130/80mmHg。对于高危患者，可考虑更严格的血压控制目标。",
            MedicalDocument.DocumentType.GUIDELINE
        );
        hypertensionGuideline.setSource("中华医学会心血管病学分会");
        hypertensionGuideline.setAuthor("中华医学会心血管病学分会高血压学组");
        hypertensionGuideline.addTag("高血压");
        hypertensionGuideline.addTag("防治指南");
        hypertensionGuideline.addTag("ACEI");
        hypertensionGuideline.addExtractedEntity("hypertension_primary");
        hypertensionGuideline.addExtractedEntity("acei_drugs");
        
        // 药物相互作用手册
        MedicalDocument drugInteractionManual = new MedicalDocument(
            "drug_interaction_manual",
            "临床药物相互作用手册",
            "华法林与阿司匹林联用时出血风险显著增加，需要密切监测INR值和临床出血征象。建议调整华法林剂量并定期复查凝血功能。ACEI类药物与保钾利尿剂联用可能导致高钾血症，需要监测血钾水平。二甲双胍与造影剂联用可能增加乳酸酸中毒风险，造影前后需要暂停使用。",
            MedicalDocument.DocumentType.REFERENCE
        );
        drugInteractionManual.setSource("临床药理学教研室");
        drugInteractionManual.addTag("药物相互作用");
        drugInteractionManual.addTag("华法林");
        drugInteractionManual.addTag("阿司匹林");
        drugInteractionManual.addTag("ACEI");
        drugInteractionManual.addTag("二甲双胍");
        
        // 糖尿病并发症
        MedicalDocument diabetesComplications = new MedicalDocument(
            "diabetes_complications_2023",
            "糖尿病并发症防治指南2023",
            "糖尿病肾病是糖尿病的主要微血管并发症之一，影响30-40%的糖尿病患者。早期干预包括血糖控制（HbA1c<7%）、血压管理（目标<130/80mmHg）和使用ACEI/ARB类药物。定期监测尿白蛋白/肌酐比值(ACR)和估算肾小球滤过率(eGFR)。对于已有肾病的患者，可考虑使用SGLT-2抑制剂或GLP-1受体激动剂以延缓肾病进展。",
            MedicalDocument.DocumentType.GUIDELINE
        );
        diabetesComplications.setSource("中华医学会内分泌学分会");
        diabetesComplications.addTag("糖尿病并发症");
        diabetesComplications.addTag("糖尿病肾病");
        diabetesComplications.addTag("ACEI");
        diabetesComplications.addExtractedEntity("diabetes_type2");
        diabetesComplications.addExtractedEntity("acei_drugs");
        
        // 存储文档
        graphRAGService.storeDocument(adaGuideline);
        graphRAGService.storeDocument(hypertensionGuideline);
        graphRAGService.storeDocument(drugInteractionManual);
        graphRAGService.storeDocument(diabetesComplications);
        
        logger.info("医学文档导入完成");
    }
} 